package main

import (
	"fmt"
	"time"
)

/*
  中介者模式
  定义一个中介对象来封装系列对象之间的交互。
  各个对象不需要显示地相互引用，从而使其耦合性松散,而且可以独立地改变它们之间的交互
  例子
  多个用户可以向聊天室发送消息，聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息
*/

type ChatRoom struct {
}

func (c ChatRoom)ShowMsg(user User, msg string)  {
	fmt.Println(time.Now()," ",user.name," said " , msg)
}

type User struct {
	name string
}

func (u User) SentMsg(room *ChatRoom, msg string)  {
	room.ShowMsg(u,msg)
}

func main() {
	room := &ChatRoom{}
	u1 := User{"jon"}
	u2 := User{"luo"}
	u1.SentMsg(room,"hi luo !!")
	u2.SentMsg(room,"hi jon !!")
}
